#ifndef __EEPROM_H
#define __EEPROM_H

#include "stm8s.h"  // 依赖STM8S标准外设库

// -------------------------- EEPROM硬件参数定义 --------------------------
#define EEPROM_START_ADDR    0x4000U          // STM8S207 EEPROM起始地址
#define EEPROM_END_ADDR      (0x4000U + 0x0800U)  // EEPROM结束地址（共2KB，可根据实际型号调整）
#define EEPROM_BLOCK_SIZE    FLASH_BLOCK_SIZE          // EEPROM块大小（64字节，STM8S标准块划分）
#define EEPROM_TOTAL_BLOCKS  ((EEPROM_END_ADDR - EEPROM_START_ADDR) / EEPROM_BLOCK_SIZE)  // 总块数（32块）

// -------------------------- 函数返回值定义 --------------------------
#define EEPROM_OK            0x00U  // 操作成功
#define EEPROM_ERR_ADDR      0x01U  // 地址错误（超出范围/未对齐）
#define EEPROM_ERR_BUSY      0x02U  // 总线忙（操作未完成）
#define EEPROM_ERR_ERASE     0x03U  // 擦除失败
#define EEPROM_ERR_NULL_PTR  0x04U  // 空指针错误（缓冲区为NULL）

// -------------------------- 函数声明 --------------------------
/**
 * @brief  检查EEPROM地址合法性
 * @param  address: 待检查的EEPROM地址（必须是0x4000~0x47FF范围内）
 * @retval EEPROM_OK: 地址合法；EEPROM_ERR_ADDR: 地址非法
 */
uint8_t eeprom_check_address(uint16_t address);

/**
 * @brief  向EEPROM写入1个字节
 * @param  address: 写入地址（需在EEPROM范围内）
 * @param  data: 待写入的字节数据
 * @retval EEPROM_OK: 写入成功；其他值：写入失败（地址错误/总线忙）
 */
uint8_t eeprom_write_byte(uint16_t address, uint8_t data);

/**
 * @brief  从EEPROM读取1个字节
 * @param  address: 读取地址（需在EEPROM范围内）
 * @retval 成功：读取到的字节数据；失败：0xFF（地址错误时返回）
 */
uint8_t eeprom_read_byte(uint16_t address);


/**
 * @brief  向EEPROM写入连续多个字节（缓冲区）
 * @param  address: 写入起始地址（需在EEPROM范围内）
 * @param  buffer: 待写入的缓冲区指针（不可为NULL）
 * @param  len: 写入字节数（需确保address+len-1 ≤ EEPROM_END_ADDR）
 * @retval EEPROM_OK: 写入成功；其他值：写入失败（地址错误/空指针/总线忙）
 */
uint8_t eeprom_write_buffer(uint16_t address, uint8_t* buffer, uint16_t len);

/**
 * @brief  从EEPROM读取连续多个字节（缓冲区）
 * @param  address: 读取起始地址（需在EEPROM范围内）
 * @param  buffer: 存储读取数据的缓冲区指针（不可为NULL）
 * @param  len: 读取字节数（需确保address+len-1 ≤ EEPROM_END_ADDR）
 * @retval 无（地址错误或空指针时不操作，缓冲区数据不变）
 */
void eeprom_read_buffer(uint16_t address, uint8_t* buffer, uint16_t len);



#endif  // __EEPROM_H